package com.zhentao.PollutionPredictio.service;


import com.zhentao.PollutionPredictio.config.ImgAndTextAi;
import com.zhentao.pojo.ChemicalFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 污染预测AI服务
 * 集成AI能力实现污染预测模块的六个核心功能
 */
@Service
public class PollutionPredictionAiService {

    @Autowired
    private ImgAndTextAi imgAndTextAi;
    
    // 简单的内存缓存，避免重复分析
    private final Map<String, String> analysisCache = new ConcurrentHashMap<>();

    /**
     * 1. 化工厂分析
     * @param factory 化工厂信息
     * @return AI分析结果
     */
    public String analyzeChemicalFactory(ChemicalFactory factory) {
        // 生成缓存键
        String cacheKey = "factory_" + factory.getFactoryId() + "_" + factory.getFactoryName();
        
        // 检查缓存
        if (analysisCache.containsKey(cacheKey)) {
            System.out.println("使用缓存的分析结果: " + cacheKey);
            return analysisCache.get(cacheKey);
        }
        
        String prompt = String.format(
            "请分析这个化工厂的污染风险等级：\n" +
            "工厂名称：%s\n" +
            "工厂类型：%s\n" +
            "主要污染物：%s\n" +
            "地址：%s\n" +
            "请从环境风险、健康影响、监管合规等角度进行综合分析，并给出风险等级建议（高/中/低）。",
            factory.getFactoryName(),
            factory.getFactoryType(),
            factory.getMainPollutants(),
            factory.getAddress()
        );

        try {
            long startTime = System.currentTimeMillis();
            String result = (String) imgAndTextAi.fastTextAnalysis(prompt);
            long endTime = System.currentTimeMillis();
            
            System.out.println("化工厂分析完成，耗时: " + (endTime - startTime) + "ms");
            
            // 缓存结果
            analysisCache.put(cacheKey, result);
            
            return result;
        } catch (Exception e) {
            System.err.println("AI分析失败，使用备用分析方案: " + e.getMessage());
            
            // 备用分析方案
            String fallbackResult = generateFallbackAnalysis(factory);
            
            // 缓存备用结果
            analysisCache.put(cacheKey, fallbackResult);
            
            return fallbackResult;
        }
    }

    /**
     * 2. 扩散路径定位
     * @param factoryId 工厂ID
     * @param weatherData 气象数据
     * @return 扩散路径分析
     */
    public String predictDiffusionPath(Long factoryId, Map<String, Object> weatherData) {
        String prompt = String.format(
            "基于以下条件预测污染物扩散路径：\n" +
            "工厂ID：%d\n" +
            "风向：%s\n" +
            "风速：%s m/s\n" +
            "温度：%s°C\n" +
            "湿度：%s%%\n" +
            "请分析污染物的扩散方向、影响范围、浓度分布，并绘制扩散路径图。",
            factoryId,
            weatherData.get("windDirection"),
            weatherData.get("windSpeed"),
            weatherData.get("temperature"),
            weatherData.get("humidity")
        );

        try {
            return (String) imgAndTextAi.simpleMultiModalConversationCall(prompt, null);
        } catch (Exception e) {
            return "扩散路径预测失败：" + e.getMessage();
        }
    }

    /**
     * 3. 污染预测模型
     * @param factoryId 工厂ID
     * @param predictionHours 预测小时数
     * @param currentData 当前环境数据
     * @return 污染预测结果
     */
    public String predictPollutionTrend(Long factoryId, int predictionHours, Map<String, Object> currentData) {
        String prompt = String.format(
            "污染预测模型分析：\n" +
            "工厂ID：%d\n" +
            "预测时长：%d小时\n" +
            "当前污染物浓度：%s\n" +
            "环境条件：%s\n" +
            "请预测未来%d小时的污染物浓度变化趋势，包括峰值时间、浓度变化曲线、影响因素分析。",
            factoryId,
            predictionHours,
            currentData.get("currentConcentration"),
            currentData.get("environmentalConditions"),
            predictionHours
        );

        try {
            return (String) imgAndTextAi.simpleMultiModalConversationCall(prompt, null);
        } catch (Exception e) {
            return "污染预测失败：" + e.getMessage();
        }
    }

    /**
     * 4. 风险评估报告
     * @param factoryId 工厂ID
     * @param riskFactors 风险因子
     * @return 风险评估报告
     */
    public String generateRiskAssessment(Long factoryId, Map<String, Object> riskFactors) {
        String prompt = String.format(
            "生成环境风险评估报告：\n" +
            "工厂ID：%d\n" +
            "风险因子：%s\n" +
            "周边环境：%s\n" +
            "历史事故：%s\n" +
            "请生成详细的风险评估报告，包括：\n" +
            "1. 健康风险评估\n" +
            "2. 生态风险评估\n" +
            "3. 经济风险评估\n" +
            "4. 风险等级评定\n" +
            "5. 风险控制建议",
            factoryId,
            riskFactors.get("riskFactors"),
            riskFactors.get("surroundingEnvironment"),
            riskFactors.get("historicalAccidents")
        );

        try {
            return (String) imgAndTextAi.simpleMultiModalConversationCall(prompt, null);
        } catch (Exception e) {
            return "风险评估报告生成失败：" + e.getMessage();
        }
    }

    /**
     * 5. 预警机制
     * @param factoryId 工厂ID
     * @param currentLevel 当前污染水平
     * @param threshold 预警阈值
     * @return 预警建议
     */
    public String generateEarlyWarning(Long factoryId, double currentLevel, double threshold) {
        String prompt = String.format(
            "智能预警分析：\n" +
            "工厂ID：%d\n" +
            "当前污染水平：%.2f\n" +
            "预警阈值：%.2f\n" +
            "超标倍数：%.2f\n" +
            "请分析当前污染状况，判断是否需要发布预警，并给出：\n" +
            "1. 预警等级（蓝色/黄色/橙色/红色）\n" +
            "2. 预警原因分析\n" +
            "3. 建议措施\n" +
            "4. 影响范围评估",
            factoryId,
            currentLevel,
            threshold,
            currentLevel / threshold
        );

        try {
            return (String) imgAndTextAi.simpleMultiModalConversationCall(prompt, null);
        } catch (Exception e) {
            return "预警分析失败：" + e.getMessage();
        }
    }

    /**
     * 6. 影响评估
     * @param factoryId 工厂ID
     * @param impactArea 影响区域
     * @param sensitiveTargets 敏感目标
     * @return 影响评估结果
     */
    public String assessImpact(Long factoryId, String impactArea, Map<String, Object> sensitiveTargets) {
        String prompt = String.format(
            "污染影响评估：\n" +
            "工厂ID：%d\n" +
            "影响区域：%s\n" +
            "敏感目标：%s\n" +
            "人口密度：%s\n" +
            "请评估污染对以下方面的影响：\n" +
            "1. 居民健康影响\n" +
            "2. 学校、医院等敏感区域影响\n" +
            "3. 生态环境影响\n" +
            "4. 社会经济影响\n" +
            "5. 应急响应建议",
            factoryId,
            impactArea,
            sensitiveTargets.get("sensitiveTargets"),
            sensitiveTargets.get("populationDensity")
        );

        try {
            return (String) imgAndTextAi.simpleMultiModalConversationCall(prompt, null);
        } catch (Exception e) {
            return "影响评估失败：" + e.getMessage();
        }
    }

    /**
     * 通用AI分析接口
     * @param analysisType 分析类型
     * @param parameters 参数
     * @return AI分析结果
     */
    public String generalAnalysis(String analysisType, Map<String, Object> parameters) {
        String prompt = String.format(
            "污染预测模块 - %s分析：\n" +
            "分析类型：%s\n" +
            "输入参数：%s\n" +
            "请基于环境科学和污染控制专业知识，提供专业的分析结果和建议。",
            analysisType,
            analysisType,
            parameters.toString()
        );

        try {
            return (String) imgAndTextAi.fastTextAnalysis(prompt);
        } catch (Exception e) {
            return "AI分析失败：" + e.getMessage();
        }
    }
    
    /**
     * 备用分析方案 - 当AI API调用失败时使用
     */
    private String generateFallbackAnalysis(ChemicalFactory factory) {
        StringBuilder analysis = new StringBuilder();
        analysis.append("=== 化工厂污染风险分析报告 ===\n\n");
        analysis.append("工厂名称：").append(factory.getFactoryName()).append("\n");
        analysis.append("工厂类型：").append(factory.getFactoryType()).append("\n");
        analysis.append("主要污染物：").append(factory.getMainPollutants()).append("\n");
        analysis.append("地址：").append(factory.getAddress()).append("\n\n");
        
        // 基于污染物类型进行简单分析
        String pollutants = factory.getMainPollutants();
        if (pollutants != null) {
            if (pollutants.contains("重金属")) {
                analysis.append("⚠️ 风险提示：该工厂排放重金属污染物，具有生物累积性和持久性，对环境和人体健康存在长期风险。\n");
            }
            if (pollutants.contains("COD") || pollutants.contains("氨氮")) {
                analysis.append("⚠️ 风险提示：该工厂排放有机污染物，可能导致水体富营养化和缺氧。\n");
            }
            if (pollutants.contains("总磷")) {
                analysis.append("⚠️ 风险提示：该工厂排放磷污染物，是水体富营养化的主要因素。\n");
            }
        }
        
        // 基于风险等级进行分析
        Integer riskLevel = factory.getRiskLevel();
        if (riskLevel != null) {
            switch (riskLevel) {
                case 1:
                    analysis.append("✅ 风险等级：低 - 建议定期监测，保持现状。\n");
                    break;
                case 2:
                    analysis.append("⚠️ 风险等级：中 - 建议加强监管，定期检查污染治理设施。\n");
                    break;
                case 3:
                    analysis.append("🚨 风险等级：高 - 建议重点监管，增加监测频次，确保污染治理设施正常运行。\n");
                    break;
                default:
                    analysis.append("❓ 风险等级：未知 - 建议进行详细评估。\n");
            }
        }
        
        analysis.append("\n=== 管理建议 ===\n");
        analysis.append("1. 建立完善的污染监测体系\n");
        analysis.append("2. 定期检查污染治理设施运行状况\n");
        analysis.append("3. 制定应急预案，提高突发环境事件应对能力\n");
        analysis.append("4. 加强与周边社区的沟通，及时公开环境信息\n");
        
        analysis.append("\n注：此分析基于基础数据生成，建议结合实地调研和详细监测数据进行综合评估。");
        
        return analysis.toString();
    }
}
